// 使用axios封装一个请求对象
import axios from "axios";
// 使用element-plus封装一个提示对象
import { ElMessage } from "element-plus";

// 工具对象
import utils from "../utils/index";

// 路由对象
import router from "../router/index";
// 状态管理,自己处理（保存用户信息、token等）
import { useAuthStore } from "../stores/userStore";

//定义生产、测试环境的请求地址
const baseURL = process.env.NODE_ENV === "production" ? "/api" : "/api";

let headers = {
  "Content-Type": "application/json;charset=utf-8",
};

// 创建axios实例
const service = axios.create({
  baseURL: baseURL,
  timeout: 3000,
  withCredentials: true,
  headers,
});

// 请求拦截器
service.interceptors.request.use(
  (config) => {
    // 1.每次请求时获取最新的token
    const auth = utils.getStorage("auth");
    const token_str = auth ? auth?.user?.token : "";
    // console.log('http.js 中获取token:', auth,token_str)

    // 处理伪登录状态start：检测到Token丢失！正在清理伪登录状态并跳转
    // 2. 获取内存中的 Pinia 状态
    const authStore = useAuthStore();
    const isPiniaLoggedIn = authStore.isAuthenticated; //用户状态

    // 3. 检查 Token 缺失且 Pinia 认为是登录状态
    if (isPiniaLoggedIn && !token_str) {
      // 用户手动清除了 localStorage，但 Pinia 状态仍为登录
      console.warn("检测到Token丢失！正在清理伪登录状态并跳转。");

      // 重要处理：清除内存中的 Pinia 状态
      authStore.logout();

      // 阻止请求继续发送，并跳转到登录页
      router.push("/login");

      // 返回一个 Pending 状态的 Promise，取消本次请求
      return Promise.reject(new Error("Token丢失,已取消请求并跳转至登录页"));
    }
    // 处理伪登录状态end

    // 4. 添加 Token 到请求头
    if (auth && token_str) {
      // console.log("携带token:", token_str);
      // 添加请求头
      config.headers["Authorization"] = "Bearer " + token_str;
    }
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

// 响应拦截器
service.interceptors.response.use((response) => {
  const res = response.data;
  // 约定，当响应状态码为 0 时，表示请求成功。其它状态全局统一处理
  // 提示信息子字段为msg，数据子字段为data
  if (res.code !== 0) {
    ElMessage({
      message: res.msg || "Error",
      type: "error",
      duration: 5 * 1000,
    });
    return Promise.reject(new Error(res.msg || "Error"));
  } else {
    return res;
  }
});

export default service;
